国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python中的對象拷貝示例 python引用傳遞

2019-11-25 18:32:45
字體:
來源:轉載
供稿:網友

何謂引用傳遞,我們來看一個C++交換兩個數的函數:

復制代碼 代碼如下:

void swap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

這個例子就是一個引用傳遞的例子!目的是說明一下概念:引用傳遞的意思就是說你傳遞的是對象的引用,對這個引用的修改也會導致原有對象的改變。學過C/C++的朋友們都知道,在交換2個數的時候,如果自己實現一個swap函數,需要傳遞其引用或者指針。

Python直接使用引用傳遞,多方便啊,你還要吐槽什么?你又想過我不想改變原對象的情況嗎?如果有,那么看這里!

假設我現在有一個list,叫做l1,我現在需要一份l1的拷貝,如果我直接使用諸如l2 = l1的方式,然后我對l2進行一系列的修改,會等價于我對l1直接做修改,這可不是我想要的!如:

復制代碼 代碼如下:

l1 = [1, 2]
l2 = l1
l2.append(3)
print l1
print l2
# l1 = [1, 2, 3], l2 = [1, 2, 3]

這就是Python引用傳遞造成的,也就是說l1和l2屬于同一list對象,那么如何才能得到一份不同的對象呢?這不是so easy嘛,用切片撒,比如:

復制代碼 代碼如下:

l1 = [1, 2]
l2 = l1[:]
l2.append(3)
# l1 = [1, 2], l2 = [1, 2, 3]

是的,目的達到了,別介,你確定這樣一定行?讓我們看看一個更復雜的情況:

復制代碼 代碼如下:

l1 = [[1, 2], 3]
l2 = l1[:]
l2.append(4)
# l1 = [[1, 2], 3], l2 = [[1, 2], 3, 4]
l2[0].append(5)
# l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4]

啊哈,貌似出問題了哈,這個可不是我們需要的!怎么辦呢?好了,進入今天的正題,Python中的copy模塊!

復制代碼 代碼如下:

import copy

如果你希望復制一個容器對象,以及它里面的所有元素(包含元素的子元素),使用copy.deepcopy,這個方法會消耗一些時間和空間,不過,如果你需要完全復制,這是唯一的方法。上面我們提到的切片的方式,等價于copy模塊中的copy函數。

上面拷貝的操作變得so easy了:

復制代碼 代碼如下:

l1 = [[1, 2], 3]
l2 = copy.copy(l1)
l3 = copy.deepcopy(l1)
l2.append(4)
l2[0].append(5)
l3[0].append(6)
# l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4], l3 = [[1, 2, 6], 3]

相關說明:

復制代碼 代碼如下:

copy(x)
    Shallow copy operation on arbitrary Python objects.
    See the module's __doc__ string for more info.
deepcopy(x, memo=None, _nil=[])
    Deep copy operation on arbitrary Python objects.
    See the module's __doc__ string for more info.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东光县| 汽车| 综艺| 吉林市| 孝昌县| 清新县| 兰西县| 青海省| 蓬安县| 禄丰县| 措勤县| 喀什市| 鱼台县| 房产| 旬邑县| 萝北县| 杭州市| 永清县| 海淀区| 吉木萨尔县| 盐城市| 阳原县| 名山县| 自治县| 逊克县| 龙陵县| 阜阳市| 富平县| 贡山| 大同县| 蕉岭县| 平南县| 普兰县| 枣阳市| 靖西县| 平阳县| 博罗县| 资源县| 那曲县| 鞍山市| 渝中区|