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,
(이 경우 목록) 같은 값에 대한 모든 지점, 또는 당신이 원하는 할a=0
,b=3
하고c=5
. 이 경우 원하는a,b,c = [0,3,5]
또는a,b,c = 0,3,5
.