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이며 ints는 변경할 수 없습니다. 각각의 경우에, 당신은 바인딩 할 수 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.