python에서 itertools groupby 모듈로 작업하면서이 이상한 현상을 보았습니다.이 할당 된 객체가 원래 객체와 동일한 메모리 공간을 공유하는 이유는 무엇입니까?
y = 7
x = y
y = 9
x will still be 7
을하지만 내가 때 : 파이썬에서
는 변수 할당 (이것은 알려 주시기 바랍니다 잘못된 경우 나의 이해에서) 대신 원래의 메모리에 대한 포인터의 새 변수 자체 메모리를 할당하는 것을 의미 groupby 모듈로 작업하면서이 모듈을 사용하여 같은 키를 가진 항목을 하나의 그룹으로 그룹화했습니다. 기억이 이미 수정되었을 것이므로 원래 그룹을 되풀이하여 반복하는 것은 쓸모가 없었습니다. 예 :
for key, group in groupby(rows, lambda x: x[0]):
data = [thing[1] for thing in group] #accesses 1st attribute of element
data2 = [thing[2] for thing in group] # would yield [] as group is empty
그래서 내가 대신이 시도 :
for key, group in groupby(rows, lambda x: x[0]):
#create a copy of group to reiterate over
toup = group
print toup #<itertools._grouper object at 0x1039a8850>
print group #<itertools._grouper object at 0x1039a8850>
data = [thing[1] for thing in group] #accesses 1st attribute of element
data2 = [thing[2] for thing in toup]
데이터 2는 두번째 항목에 액세스해야하지만 수익률은 [] 그들은 주 모두 있기 때문에 같은 메모리가
내 질문은 왜 이런 일이 않습니다됩니다 ? toup toup에 그룹을 지정하면 다른 16 진수 주소 위치에 그룹 메모리 사본이 생깁니 까?
또한이 문제를 우회하여 두 번의 groupby 반복을 쓸 필요가 없도록하려면 어떻게해야합니까? 파이썬에서
변수의 유형에 따라 다릅니다. 정수 및 문자열과 같은 프리미티브는 다른 변수에 할당하면 인스턴스 객체가 복사되지 않으므로 복사됩니다. 변수는 대신 인스턴스 객체에 대한 참조가됩니다. "a = []; b = a; print (a is b)"를 시도하면 True를 인쇄합니다. –
* "변수 할당은 원래 메모리를 가리키는 포인터 대신에 새로운 변수에 자체 메모리를 할당하는 것을 의미합니다."* - Python 이름이 작동하지 않는 잘못된 방법입니다 (예 : http://nedbatchelder.com/text/names.html 참조) . 복사본을 생성하려면'toup = group [:]'을 사용하십시오. – jonrsharpe
@Rawing은 사실이 아닙니다. (처음에는 파이썬이 실제로는 프리미티브를 가지고 있지 않으며, 예를 들어 정수 *는 * 인스턴스입니다.); 차이점은 정수는 불변이다. 목록은 변경할 수 있습니다. 'a = 1; b = a; a is b'' * 여전히 * True이면,'b + = 1'은'a'에 영향을 미치지 않습니다 (정수는 불변이므로). – jonrsharpe