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

python赋值和拷贝

时间:2023-01-21 10:00:45浏览次数:54  
标签: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_12148962/6021074

相关文章

  • 【python】Matplotlib库学习笔记
    Matplotlib是python的绘图库。以下内容主要介绍Matplotlib的子库pyplot。pyplot是常用的2D绘图模块,包含一系列绘图相关函数。plot()函数plot()函数可以用来绘制......
  • 【ABAQUS 二次开发笔记】使用keyword 、python和matlab一起处理Odb数据
    用conversionshellelement(S4R单元)建模层合板,有6层ply,每个lamina(ply)有3个integrationpoint,共计18个integrationpoint。我想得到集合SET-Middle-elem中所有integrati......
  • 安装 python in Linux: Ubuntu at WSL on windows
      安装ubuntu20.04appstore安装ubuntu安装异常:https://thegeekpage.com/wslregisterdistribution-failed-with-error-0x8007019e/    安装python3.8.1......
  • Python入门之数据类型转换
    """数据类型转换运算符算数运算符增强运算符"""#1.数据类型转换#intfloatstrstr_usb=input("请输入美元:")#类型转换str-->intin......
  • Python入门之数据类型
    """核心数据类型"""#1.Nonea01="张无忌"#接触变量与数据的绑定关系a01=None#使用None占位sex=None流程图:   #2.整形int#十进制nu......
  • Python 永久换源
    Python永久换源pipconfigsetglobal.index-urlhttps://pypi.douban.com/simple源地址:#腾讯http://mirrors.tencentyun.com/pypi/simple#阿里https://mirrors......
  • 利用艾宾浩斯曲线生成单词背诵规划表——python
    利用艾宾浩斯遗忘曲线生成单词背诵计划表#以下代码根据需背诵list总数(listcount)、复习间隔天数(days)#来自动生成单词背诵规划表,包括背诵周期、某天应学习复习list。#......
  • 【python】pandas库学习笔记
    北京理工大学嵩天Pandas课程学习笔记。部分内容补充自菜鸟教程。Pandas库提供了共性能易用数据类型和分析工具的第三方python库。Pandas库基于Numpy库实现。Pandas......
  • python基础
    字面量被写下来的固定的值,成为字面量常见的6种值数字intfloatcomplex(复数,以j结尾表示复数),bool控制精度m.n m控制宽度(小数点也计入),设置的宽度小于数字自身不生......
  • python3.10在centos7上构建
    概述在centos7上安装py3.10,用到openssl库envcentos7.8Python-3.10.7.tgzlinkhttps://www.jianshu.com/p/c3c8003d276001下载Python3.10.7https://www.pytho......