初学Python,有一定C/C++基础。
看到Tuple的"immutable"的时候产生了这样一个疑问。
根据我的理解,如果Tuple的元素是普通变量(e.g. myInt=5),那创建
myTuple=(myInt,)
的意义就是
myTuple=(myInt的值,)
因此是不变的。
但是如果myTuple=(myInt,myList),虽然myTuple[1]永远都指向myList,但是myList中的内容是可以改变的。看到有人表示这Tuple里的List实际上是myList的引用。那能否用C++的指针/引用来类比统一解释一下这种Tuple元素的immutable特性呢?
【补充一下:比如对于myTuple=(myInt,myList),定义的时候,从意义上感觉(非严谨),就像是用C++写:
myTuple[0]=myInt; //myInt之后发生了什么都和myTuple[0]无关了,myTuple[0]只决定于myInt当前值
&myTuple[1]=myList; //而myTuple[1]更像是myList的一个引用。myList如果变化,myTuple[1]也会变化
于是这里就产生了“同样是对Tuple赋值,却有两种不同的意义”的矛盾。有什么解释方式能调和这种矛盾么?】
表述的不太清楚,希望能有理解了我的疑问的朋友呀。多谢了。
당신의 비유가 잘못되었습니다.
myTuple=(myInt,myList)
는 언제든지 가능합니다:Python의 모든 것은 객체이므로
myInt
도 객체입니다.튜플
은불변
이므로 해당 요소를 다시 할당할 수 없습니다. 즉, 두 포인터 변수myTuple[0]
및myTuple[1]
의 값을 변경할 수 없으므로 항상myInt를 가리킵니다.
및 myList는 확실합니다.그러나 객체가 변경 가능해야 한다면
tuple
의 각 요소가 가리키는 객체 자체를 수정할 수 있습니다. 예를 들어myList
는 변경 가능한 객체이므로 수정할 수 있습니다. 그러나myInt
는 작동하지 않습니다. 정수도 불변 객체이므로 수정할 수 없기 때문입니다.포인터는 숫자가 적힌 작은 종이 조각으로 이해됩니다. 종이에 적힌 숫자는 물건을 얻으려면 어느 서랍으로 가야 하는지 알려줍니다.
그러면 튜플은 다음과 같습니다:
myTuple이 있으면 myTuple이라는 이름의 메모가 있습니다. 서랍 안에는 하나 이상의 작은 메모가 있는 서랍이 있습니다. 그리고 이러한 전표의 수는 확실하며 myTuple 전표를 버리거나 myTuple의 번호를 다른 번호로 교체할 때까지 변경되지 않을 수 있습니다.
myTuple이
(myInt,)
에서(myInt, myList)
로 변경되는 과정은 실제로 myTuple의 숫자가 다시 작성되고 새 항목으로 이동됨을 의미합니다. 번호에 해당하는 다른 서랍에 종이 쪽지 두 장을 넣습니다. 첫 번째는 원래 myInt 쪽지이고, 두 번째 쪽은 새로 추가된 myList 쪽지입니다.myList에 요소를 추가하거나 삭제하면 실제로 myList 메모를 기반으로 작업을 수행하는 해당 서랍을 찾습니다. 이는 단지 myTuple에 숫자가 있을 뿐입니다. myTuple 전표의 숫자와 관련된 myTuple의 메모는 동일합니다.
그냥 상수 포인터일 뿐입니다.
함수를 사용하여 매개변수를 전달할 수 있다고 생각되는 시나리오에 대한 설명
1. 참조에 의한 변수 객체 전달: 객체에 대한 포인터가 함수 내부와 외부 모두에 유지됩니다. . 객체는 함수 내부와 외부에서 사용됩니다. 함수 내부에서 객체를 변경하면 참조로 전달하는 것과 유사하게 함수 외부에서도 변경됩니다.
2. 불변 객체의 복사본 전송: 불변 객체는 원래 메모리 공간에서 변경할 수 없으므로 해당 값을 변경하려는 경우 인터프리터는 이때 새 변수를 저장하기 위해 새 객체를 생성합니다. 함수 내부와 외부는 동일하지 않습니다. 객체 - 이전 객체는 여전히 함수 외부에서 사용되지만, 새로운 객체가 함수 내부에서 사용되었습니다.
먼저 myList가 주소(또는 참조, 포인터와 같다고 생각함)를 가리키는 목록 개체인지 확인하고 myTuple은 이 참조를 저장합니다. myList는 가변적이므로 추가, 삭제가 가능하지만 주소는 변경되지 않습니다. myList를 다른 개체로 지정하면 주소가 변경됩니다. 이때 변경된 myList는 myTuple에 영향을 미치지 않습니다. Tuple이 저장한 목록 객체는 변경되지 않았으므로 myTuple과는 아무런 관련이 없습니다.
파이썬에서 myInt는 정수 엔터티를 가리키는 참조이기도 합니다. 이는 c/C++에서 myInt는 이러한 방식으로 Tuple에 저장되는 정수 엔터티입니다. Quote는 Int는 변경할 수 없고 List는 변경할 수 있다는 차이점이 있습니다.
그래서 언급한 모순은 존재하지 않습니다.