변수를 초기화하기 위해 아래에 표시된 것처럼 여러 대입을 사용하려고했지만 동작에 혼란스러워서 값 목록을 별도로 다시 할당 할 것으로 예상합니다. 전과 같이 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 / etc의 언어에서 Python으로오고 있다면 a
“가변”이라고 생각하지 않고 “이름”으로 생각하기 시작하는 것이 도움이 될 수 있습니다 .
a
, b
및 c
값이 같은 변수가 아닙니다. 그들은 동일한 동일한 값을 위해 다른 이름입니다. 변수에는 유형, ID, 주소 및 모든 종류의 것들이 있습니다.
이름은 그 중 하나도 없습니다. 값은 물론, 할, 당신은 같은 값의 이름을 많이 할 수 있습니다.
Notorious B.I.G.
핫도그 를주고 * 핫도그 Biggie Smalls
를 Chris Wallace
가지고 있다면. 첫 번째 요소 a
를 1로 변경하면 b
및 의 첫 번째 요소 c
는 1입니다.
두 개의 이름이 같은 객체를 명명하는지 알고 싶다면 is
연산자를 사용하십시오 .
>>> a=b=c=[0,3,5]
>>> a is b
True
그런 다음 묻습니다.
이것과 다른 점은 무엇입니까?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
여기에서 이름 e
을 값으로 리 바인딩합니다 4
. 즉, 이름에 영향을주지 않습니다 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
여전히 같은 개체의 이름을 지정합니다.
커버 아래에서 a[0]=1
실제로 목록 객체에서 메소드를 호출합니다. (이것은에 해당합니다 a.__setitem__(0, 1)
.) 따라서 실제로는 아무 것도 리 바인드 하지 않습니다 . 전화하는 것과 같습니다 my_object.set_something(1)
. 물론, 객체가이 메소드를 구현하기 위해 인스턴스 속성을 리 바인드하고있을 수도 있지만, 중요하지는 않습니다. 중요한 것은 아무것도 할당하지 않고 객체를 변경하는 것입니다. 와 동일합니다 a[0]=1
.
사용자 요청 :
우리가 가지고 있다면
a = b = c = 10
그것은 정확히 같은 상황 a = b = c = [1, 2, 3]
입니다. 같은 값을 가진 세 개의 이름이 있습니다.
그러나이 경우 값은 int
이며 int
s는 변경할 수 없습니다. 각각의 경우에, 당신은 바인딩 할 수 a
다른 값 (예를 들어,에 a = "Now I'm a string!"
)하지만, 원래 값에 영향을 미치지 않습니다 b
와 c
아직의 이름이 될 것이다. 차이는 목록, 값을 변경 할 수 있다는 것입니다 [1, 2, 3]
으로 [1, 2, 3, 4]
수행하여, 예를 들면 a.append(4)
; 즉 실제로하는 가치 변화하고 있기 때문에 b
과 c
에 대한 이름은을, b
지금 ㄱ 것이다 [1, 2, 3, 4]
. 값 10
을 다른 것으로 바꿀 방법이 없습니다. 10
뱀파이어가 영원히 5 일 때와 마찬가지로 (최소한 그녀는 Kirsten Dunst로 교체 될 때까지)
* 경고 : 악명 높은 BIG에게 핫도그를주지 마십시오. 자정 이후에는 갱스터 랩 좀비를 먹여서는 안됩니다.
답변
기침
>>> 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'}
>>>
답변
예, 이것이 예상되는 동작입니다. 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
파이썬에서 대 입문은 객체를 복사하지 않습니다. 그것들은 이름을 객체에 바인딩하며, 객체는 설정 한만큼 많은 레이블을 가질 수 있습니다. 첫 번째 편집에서 a [0]을 변경하면 a, b 및 c가 모두 참조하는 단일 목록의 한 요소가 업데이트됩니다. 두 번째로 e를 변경하면 e를 다른 객체의 레이블 (3 대신 4)로 전환합니다.
답변
파이썬에서는 모든 것이 객체이며 “단순한”변수 유형 (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도 변경됩니다.
답변
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
답변
첫 번째 예 a = 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
도움이 되었기를 바랍니다!
답변
간단히 말해서 첫 번째 경우에는 여러 이름을에 할당하는 것 list
입니다. 하나의 목록 사본 만 메모리에 작성되며 모든 이름은 해당 위치를 참조합니다. 따라서 이름을 사용하여 목록을 변경하면 실제로 메모리의 목록이 수정됩니다.
두 번째 경우, 동일한 값의 여러 사본이 메모리에 작성됩니다. 따라서 각 사본은 서로 독립적입니다.