programing

여러 변수를 동일한 값에 할당하는 Python?행동을 나열

instargram 2023. 5. 17. 22:27
반응형

여러 변수를 동일한 값에 할당하는 Python?행동을 나열

변수를 초기화하기 위해 아래와 같이 다중 할당을 사용하려고 했지만 동작에 혼란이 발생했습니다. 값 목록을 별도로 재할당해야 합니다. 즉, 이전과 같이 b[0]와 c[0]가 0입니다.

a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)

결과: [1, 3, 5] [1, 3, 5] [1, 3, 5]

그것이 맞습니까?다중 과제에 무엇을 사용해야 합니까?이것과 무엇이 다릅니까?

d=e=f=3
e=4
print('f:',f)
print('e:',e)

결과: ('f:', 3) ('e:', 4)

만약 당신이 C/Java/등 계열의 언어에서 Python으로 오고 있다면, 그것은 당신이 생각하는 것을 멈추는 데 도움이 될 것입니다.a"이름"으로 생각하기 시작합니다.

a,b,그리고.c동일한 값을 가진 다른 변수가 아니라 동일한 값에 대한 다른 이름입니다.변수에는 유형, ID, 주소 등이 있습니다.

이름에는 그런 것이 없습니다.물론 값은 동일한 값에 대한 많은 이름을 가질 수 있습니다.

을 ,Notorious B.I.G. * 핫그도*, *Biggie Smalls그리고.Chris Wallace핫도그를 먹다첫 번째 요소를 변경하는 경우a의 첫 번 에 요 인 소 째 1▁의 첫 번째 ▁1b그리고.c1입니다.

의 이름이 개체의 인지 알고 , 두이동개지확면인려하지는정하를 합니다.is연산자:

>>> a=b=c=[0,3,5]
>>> a is b
True

그러면 다음과 같이 묻습니다.

이것과 무엇이 다릅니까?

d=e=f=3
e=4
print('f:',f)
print('e:',e)

여기, 이름을 다시 바인딩합니다.e4을 주지 d그리고.f어떤 식으로든

버전에서는 이버전서다할다니습했당음에 .a[0]하지 않는a에서 관에서점.a[0]당신은 다시 구속됩니다.a[0] 지만의관보면의 에서.a당신은 제자리에서 그것을 바꾸고 있습니다.

당신은 할 수 .id어떤 물체의 정체성을 나타내는 몇 가지 고유한 숫자를 제공하는 함수는 어떤 물체가 어떤 물체인지 정확히 알 수 있습니다.is어쩔 수 없음:

>>> a=b=c=[0,3,5]
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261120
>>> id(b[0])
4297261120

>>> a[0] = 1
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261216
>>> id(b[0])
4297261216

:a[0]값의 이 되었습니다.4297261120으로 4297261216으로 변경되었습니다. 이제 다른 값의 이름이 되었습니다.그리고.b[0]이제 동일한 새 값의 이름이기도 합니다.ㅠㅠㅠa그리고.b동일한 개체의 이름을 지정하는 중입니다.


에는, 이불속서에,서▁under에속,▁the.a[0]=1실제로 목록 개체에서 메서드를 호출하고 있습니다.(이는 다음과 같습니다.a.__setitem__(0, 1).) 그래서, 그것은 실제로 아무것도 재결합하지 않습니다.전화하는 것과 같습니다.my_object.set_something(1)물론, 객체가 이 방법을 구현하기 위해 인스턴스 속성을 다시 바인딩하고 있을 수도 있지만, 그것이 중요한 것은 아닙니다. 중요한 것은 당신이 아무것도 할당하지 않고 단지 객체를 변형시키고 있다는 것입니다.그리고 그것은 마찬가지입니다.a[0]=1.


사용자 570826 질문:

만약 우리가 그랬다면,a = b = c = 10

그것은 정확히 같은 상황입니다.a = b = c = [1, 2, 3]같은 값의 이름이 세 개 있습니다.

이이 하만이경, 그값은입니다.int,그리고.ints는 불변입니다.어느 경우든, 당신은 다시 바인딩할 수 있습니다.a다른 값(예:a = "Now I'm a string!" 는 값에 을 주지 입니다. 이는 ), 하만지원영미치않지을것입다니을향에값.b그리고.c여전히 이름이 될 것입니다다른 점은 목록을 사용하여 값을 변경할 수 있다는 것입니다.[1, 2, 3]안으로[1, 2, 3, 4]다음과 같이 함으로써, 예를 들어,a.append(4)그것이 실제로 가치를 바꾸고 있기 때문에.b그리고.c이름은 다음과 같습니다.b b 이제 b입니다.[1, 2, 3, 4]할 니 법 이 없 니 습10다른 것으로. 10클라우디아처럼 뱀파이어는 영원히 10입니다(최소한 그녀가 커스틴 던스트로 대체되기 전까지는).


경고: 악명 높은 B.I.G.에게 핫도그를 주지 마십시오.갱스터 랩 좀비들은 자정 이후에는 절대 먹여서는 안 됩니다.

기침

>>> a,b,c = (1,2,3)
>>> a
1
>>> b
2
>>> c
3
>>> a,b,c = ({'test':'a'},{'test':'b'},{'test':'c'})
>>> a
{'test': 'a'}
>>> b
{'test': 'b'}
>>> c
{'test': 'c'}
>>> 

파이썬에서 모든 것은 객체이며, 또한 "단순한" 변수 유형(int, float 등)입니다.

변수 값을 변경하면 실제로 포인터가 변경되고, 두 변수를 비교하면 포인터가 비교됩니다.

결과적으로 내부 변수 값을 변경하면 메모리의 값이 변경되고 이 주소를 가리키는 모든 변수에 영향을 미칩니다.

예를 들어, 다음 작업을 수행할 때:

a = b =  5 

이것은 a와 b가 5 값을 포함하는 메모리의 동일한 주소를 가리키지만 다음과 같은 경우를 의미합니다.

a = 6

a는 이제 6을 포함하는 다른 메모리 위치를 가리키고 b는 여전히 5를 포함하는 메모리 주소를 가리키기 때문에 b에는 영향을 주지 않습니다.

하지만 다음과 같은 경우:

a = b = [1,2,3]

a와 b는 다시 같은 위치를 가리키지만, 목록 값 중 하나를 변경하면 다음과 같은 차이점이 있습니다.

a[0] = 2

이것은 a가 가리키는 메모리의 값을 변경하지만, a는 여전히 b와 같은 주소를 가리키며, 결과적으로 b도 변경됩니다.

예, 이것이 예상되는 동작입니다. a, b, c는 모두 동일한 목록에 대한 레이블로 설정됩니다.세 개의 서로 다른 목록을 원하는 경우 목록을 개별적으로 할당해야 합니다.명시적 목록을 반복하거나 다양한 방법 중 하나를 사용하여 목록을 복사할 수 있습니다.

b = a[:] # this does a shallow copy, which is good enough for this case
import copy
c = copy.deepcopy(a) # this does a deep copy, which matters if the list contains mutable objects

Python의 할당 문은 개체를 복사하지 않습니다. 이름을 개체에 바인딩하며 개체는 설정한 개수만큼의 레이블을 가질 수 있습니다.첫 번째 편집에서 a[0]를 변경할 때 a, b 및 호출이 참조하는 단일 목록의 한 요소를 업데이트합니다.두 번째로 e를 변경하면 e를 다른 개체의 레이블로 전환합니다(3 대신 4).

사용할 수 있습니다.id(name)나타내는지 합니다.

>>> a = b = c = [0, 3, 5]
>>> print(id(a), id(b), id(c))
46268488 46268488 46268488

목록은 가변적입니다. 즉, 새 개체를 만들지 않고 제자리에서 값을 변경할 수 있습니다.그러나 값을 변경하는 방법에 따라 다릅니다.

>>> a[0] = 1
>>> print(id(a), id(b), id(c))
46268488 46268488 46268488
>>> print(a, b, c)
[1, 3, 5] [1, 3, 5] [1, 3, 5]

목록을 새목을경우는에 한다면.a그러면 ID가 변경되어 영향을 미치지 않습니다.b그리고.c의 값값 의:

>>> a = [1, 8, 5]
>>> print(id(a), id(b), id(c))
139423880 46268488 46268488
>>> print(a, b, c)
[1, 8, 5] [1, 3, 5] [1, 3, 5]

정수는 불변이므로 새 개체를 만들지 않고는 값을 변경할 수 없습니다.

>>> x = y = z = 1
>>> print(id(x), id(y), id(z))
507081216 507081216 507081216
>>> x = 2
>>> print(id(x), id(y), id(z))
507081248 507081216 507081216
>>> print(x, y, z)
2 1 1

번째 에서 당의첫번예에서째신▁in서예에▁your▁examplea = b = c = [1, 2, 3]당신은 정말로 말하고 있습니다:

 'a' is the same as 'b', is the same as 'c' and they are all [1, 2, 3]

'a'를 1, 'b'를 '2', 'c'를 3으로 설정하려면 다음을 시도합니다.

a, b, c = [1, 2, 3]

print(a)
--> 1
print(b)
--> 2
print(c)
--> 3

이것이 도움이 되길 바랍니다!

필요한 것은 다음과 같습니다.

a, b, c = [0,3,5] # Unpack the list, now a, b, and c are ints
a = 1             # `a` did equal 0, not [0,3,5]
print(a)
print(b)
print(c)

간단히 말해서, 첫 번째 경우, 당신은 여러 개의 이름을 할당하고 있습니다.list메모리에 목록 복사본이 하나만 생성되고 모든 이름이 해당 위치를 참조합니다.따라서 이름을 사용하여 목록을 변경하면 실제로 메모리의 목록이 수정됩니다.

두 번째 경우에는 동일한 값의 복사본이 메모리에 여러 개 생성됩니다.따라서 각 사본은 서로 독립적입니다.

필요한 기능을 수행하는 코드는 다음과 같습니다.

# test

aux=[[0 for n in range(3)] for i in range(4)]
print('aux:',aux)

# initialization

a,b,c,d=[[0 for n in range(3)] for i in range(4)]

# changing values

a[0]=1
d[2]=5
print('a:',a)
print('b:',b)
print('c:',c)
print('d:',d)

결과:

('aux:', [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]])
('a:', [1, 0, 0])
('b:', [0, 0, 0])
('c:', [0, 0, 0])
('d:', [0, 0, 5])

한 값을 하려면 여러변에동값일을할당선면다호니합려하한수▁prefer를 선호합니다.list

a, b, c = [10]*3#multiplying 3 because we have 3 variables
print(a, type(a), b, type(b), c, type(c))

출력:

10 <class 'int'> 10 <class 'int'> 10 <class 'int'>

여러 개체 초기화:

import datetime

time1, time2, time3 = [datetime.datetime.now()]*3

print(time1)
print(time2)
print(time3)

출력:

2022-02-25 11:52:59.064487
2022-02-25 11:52:59.064487
2022-02-25 11:52:59.064487

기본적으로: 기적으로본예.a = b = 10둘 다를 의미합니다.a그리고.b을 가리키고 있습니다.10메모리에서, 당신은 테스트할 수 있습니다.id(a)그리고.id(b)정확히 같은 결과가 됩니다.a is b~하듯이True.

is하지 않습니다. 메모리 위치는 일치하지 않습니다.==값과 일치합니다.

당신이 가치를 업데이트하고 싶다고 가정해 보겠습니다.a105 위치를 있었기 은 리모위치동메모위가있치리때었고키다문다같있수의 하게 될 것입니다.b는 또한 또다가것입다니킬리한을음▁to를 입니다.5최초의 선언 때문에.

결론은 결과를 알고 있는 경우에만 사용하는 것입니다. 그렇지 않으면 단순히 사용합니다.,와 같은 a, b = 10, 10메모리 위치가 다르기 때문에 값을 업데이트할 때 위와 같은 결과가 발생하지 않습니다.

동작이 정확합니다.그러나 모든 변수는 동일한 참조를 공유합니다.아래의 동작에 유의하십시오.

>>> a = b = c = [0,1,2]
>>> a
[0, 1, 2]
>>> b
[0, 1, 2]
>>> c 
[0, 1, 2]
>>> a[0]=1000
>>> a
[1000, 1, 2]
>>> b
[1000, 1, 2]
>>> c
[1000, 1, 2]

그래서, 네, 만약 당신이 a, b, c를 다른 선에서 다르게 할당한다면, 하나를 바꾸는 것은 다른 선을 바꾸지 않을 것이라는 점에서 다릅니다.

다음 두 가지 코드 중 하나를 선택할 수 있습니다.

a = b = c = [0, 3, 5]
a = [1, 3, 5]
print(a)
print(b)
print(c)

또는

a = b = c = [0, 3, 5]
a = [1] + a[1:]
print(a)
print(b)
print(c)

언급URL : https://stackoverflow.com/questions/16348815/python-assigning-multiple-variables-to-same-value-list-behavior

반응형