python引用传递产生的问题_理解Python中传递值和引用时出现问题
我可以看到三個基本的Python概念,它們可以為這個問題提供一些啟示:
1)首先,來自可變對象的賦值,如self.foo = arg1
就像復制指針(而不是所指向的值):self.foo和{}是相同的對象。這就是為什么接下來的路線
^{pr2}$
修飾arg1(即Person1)。因此變量是不同的“名稱”或“標簽”,它們可以指向唯一的對象(這里是person對象)。這解釋了baz(Person1)將Person1.age和bar1.foo.age修改為27,因為Person1和{}只是相同person對象(Person1 is bar1.foo返回{},在Python中)的兩個名稱。在
第二個重要的概念是作業。在def teh(arg1):
arg1 = [3,2,1]
變量arg1是本地的,因此代碼meh = [1,2,3]
teh(meh)
首先是arg1 = meh,這意味著arg1是列表meh的附加(本地)名稱;但是做arg1 = [3, 2, 1]就像說“我改變主意了:arg1從現在起將成為一個新的列表的名稱,[3,2,1]”。這里要記住的重要一點是,盡管賦值用“等號”表示,但它們是不對稱的:它們給右邊和右邊的(可變)對象一個額外的名稱,在左邊給出(這就是為什么你不能做[3, 2, 1] = arg1,因為左邊必須是一個或多個名稱)。因此,arg1 = meh; arg1 = [3, 2, 1]不能改變meh。在
3)最后一點與問題標題有關:“通過值傳遞”和“通過引用傳遞”不是Python中相關的概念。相關的概念是“可變對象”和“不可變對象”。列表是可變的,而數字是可變的,這就解釋了你所觀察到的。另外,你的Person1和bar1對象是可變的(這就是為什么你可以改變人的年齡)。您可以在atext tutorial和avideo tutorial中找到有關這些概念的更多信息。維基百科也有一些(more technical) information。一個例子說明了可變和不變行為之間的區別:x = (4, 2)
y = x # This is equivalent to copying the value (4, 2), because tuples are immutable
y += (1, 2, 3) # This does not change x, because tuples are immutable; this does y = (4, 2) + (1, 2, 3)
x = [4, 2]
y = x # This is equivalent to copying a pointer to the [4, 2] list
y += [1, 2, 3] # This also changes x, because x and y are different names for the same (mutable) object
最后一行是與y = y + [1, 2, 3]等價的not,因為這只會將一個新的list對象放入變量y,而不是同時更改y和{}所引用的列表。在
上面的三個概念(變量是[可變對象的名稱]、非對稱賦值和可變/不變性)解釋了Python的許多行為。在
總結
以上是生活随笔為你收集整理的python引用传递产生的问题_理解Python中传递值和引用时出现问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刺激战场野餐点(一提刺激消费)
- 下一篇: websocket python爬虫_p