2013-09-22 1 views
0

초기화 :나는 이것이 버그인지 모르거나 내가 배열에서 * 토큰의 잘못된 의미 론적 의미를 가지고 매트릭스 python3

>>> arr = [None] * 5 # Initialize array of 5 'None' items 
>>> arr 
[None, None, None, None, None] 
>>> arr[2] = "banana" 
>>> arr 
[None, None, 'banana', None, None] 
>>> # right? 
... 
>>> mx = [ [None] * 3 ] * 2  # initialize a 3x2 matrix with 'None' items 
>>> mx 
[[None, None, None], [None, None, None]] 
>>> # so far, so good, but then: 
... 
>>> mx[0][0] = "banana" 
>>> mx 
[['banana', None, None], ['banana', None, None]] 
>>> # Huh? 

는이 버그, 아니면 내가 잘못 의미를 가지고 않았다 __mult__ 토큰의 의미는 무엇입니까?

답변

1

동일한 참조를 목록에 여러 번 복사하고 있습니다. 그것은 다음과 같이 수행

matrix = [[None]*3 for i in range(2)]

+0

그래서, 다음 정확히'*'토큰의 의미는 무엇입니까? 객체의 참조를 복사하면 첫 번째 부분에서 arr [2] = "banana"를 전달할 때 그 목록이'[ 'banana', 'banana', 'banana' ','banana ','banana ']'가 아니라 위의 하나. – user2804578

+0

오, 그냥 [다른 곳에 StackOverflow] (http://stackoverflow.com/questions/9658459/initializing-matrix-in-python-using-0xy-creates-linked-rows/9658522#9658522) 대답에 부딪 혔습니다. '*'토큰이 다른 기본 데이터 타입과 같은 의미를 가지고 있지 않다는 것을 알게되었습니다. – user2804578

+0

실제로 같은 의미를 가지고 있습니다. 변경할 수없는 유형의 경우 "복사 중"과 같은 작업을 수행하면 항상 동일한 값이 할당 된 새 객체가 만들어 지지만 변경 가능한 객체는 참조가 복사됩니다. 타입이 불변 인 것을 의미하는 것에 대한 더 좋은 독서가 있습니다. http://stackoverflow.com/questions/8056130/immutable-vs-mutable-types-python – Ben