首页 > 编程语言 >Python赋值和拷贝

Python赋值和拷贝

时间:2022-12-23 15:35:32浏览次数:32  
标签:passengers 函数 Python self 参数 拷贝 def 赋值

赋值

值相同,内存地址相同--函数参数传递

浅拷贝

值相同,内存地址不同。

拷贝第一层内存地址的引用。第一层元素为可变元素。拷贝过的引用会跟着发生变化。否则不发生变化

import copy
a = [[], 'hello', 'world', {}]
b = a
c = copy.copy(a)
a
[[], 'hello', 'world', {}]
b
[[], 'hello', 'world', {}]
c
[[], 'hello', 'world', {}]
a[0].append('hi')
a.append('小明')
a
[['hi'], 'hello', 'world', {}, '小明']
b
[['hi'], 'hello', 'world', {}, '小明']
c
[['hi'], 'hello', 'world', {}]

浅拷贝只是拷贝第一层地址的引用

函数参数传递--引用

class T:

    def __init__(self, passengers=[]):
        self.passengers = passengers

    def pick(self, v):
        self.passengers.append(v)

    def remove(self, v):
        self.passengers.remove(v)

        
t1 = T()
t1..pick('hi')
t2 = T()
t1.passengers
t2.passengers

# ['hi']
# ['hi']

出现问题的原因是:实例化对象时没有指定 passengers 实例会共享列表

问题根源:默认值在定义函数时计算(通常在加载模块时)__init__检查参数为None赋值一个列表。否则示例化时共享列表。

防御可变函数带来的影响

如果函数接受可变参数。应该谨慎考虑调用方法是否期望修改传入的参数。

例如:参数是一个字典,而且在处理的过程中需要修改它。那么,你要考虑!!!函数外部是否会收到影响

# passengers 避免受到影响

class Test:

    def __init__(self, passengers=None):
        if passengers is None:
            self.passengers = []
        else:
            # 深拷贝
            self.passengers = list(passengers)

    def pick(self, v):
        self.passengers.append(v)

    def remove(self, v):
        self.passengers.remove(v)
        
        
 def test(passengers=None):
    if passengers is None:
        passengers = []
    else:
        # 深拷贝
        passengers = copy.deepcopy(passengers)

函数传递的方式

人们经常说:参数按值传递,但是这里是值得引用。这么说没有错,但是会引起误解。因为,在旧式语言中,最常用的参数传递方式有根据值传递(函数得到参数的副本)和按照引用传递(函数得到参数的指针)。Python中函数得到参数的副本(可以理解为浅拷贝),但是参数始终是引用。因此,参数是一个可变对象,那么对象可能被修改,但是对象的标识(内存地址)不变。此外,因为函数得到的参数是引用的副本。所以重新绑定对函数的外部没有影响。

简单理解

def func(x=[[], 1]):
    print(x)
    x.append('a')
    print(x)
    x[0].append('b')
    print(x)
# func 参数时一个可变类型
func()
func()
# 第一次调用x=[['b'], 1, 'a']
# 此时在func(x=[['b'], 1, 'a']) 不在是 func(x=[[], 1])。有点类似 在函数外部定义的 x=[[], 1]

标签:passengers,函数,Python,self,参数,拷贝,def,赋值
From: https://blog.51cto.com/u_14967494/5965796

相关文章

  • Python 字典与集合
    字典(Dictionary)字典介绍字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。可以通过“键对象”实现快速获取、删除、更新......
  • python3 gettext pybabel的使用
    1.pipinstallbabelhttps://www.osgeo.cn/babel/cmdline.html#2.编写要翻译的文件importgettextt=gettext.translation('spam','./locale',languages=['en'])t......
  • 自定义python Django文件存储系统
    在学习Django框架的时候,我们已经讲过,Django自带文件存储系统,但是默认文件存储在本地,在本项目中,我们需要将文件保存到FastDFS服务器上,所以需要自定义文件存储系统。自定义......
  • 小数据池、深浅拷贝、集合
    0、pycharm是代码块、黑窗口是小数据池、如下图:1、驻留机制(长得像的共用一个内存地址)分小数据池缓存机制:后期开发时能明确知道、为什么不能正常使用、把经常用的东西放入规......
  • Python从入门到精通(第2版)——pyuic5: error: no such option: -m的问题解决
    前言在学习《Python从入门到精通(第2版)》的第15章GUI界面编程——15.2.4将.ui文件转换为.py文件时,按照书中步骤出错时的问题解决,希望对同样学习本书的同学有所帮助。问......
  • Python | Opencv的人脸检测和人类识别
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • Linux服务器安装python3.7环境
    安装python3.7依赖yum-yinstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgdbm-develdb4-devellibpcap-develxz-......
  • python数据分析练习
    第一部分:数据类型处理数据加载字段含义:user_id:用户IDorder_dt:购买日期order_product:购买产品的数量order_amount:购买金额df=pd.read_csv('../data/CDN......
  • Python网络爬虫——爬取和分析福建二手房房价及各项数据
    一、 选题的背景介绍随着越来越多城市的房地产市场进入存量时代,二手房市场的地位愈发重要,其走势对于房地产整体市场的影响也逐渐加强。在很多二手房市场规模占比较高的一......
  • 如何使用 Python 进行内存管理
    关于首先python进行内存管理就不得不提到Python解释器在何种情况下会释放变量的内存。Python引用了内存计数这一简单的计数来控制。当一个变量的引用计数为0的时候,就会被解......