0
点赞
收藏
分享

微信扫一扫

[记录][python] 引用传递,值传递

苦茶如歌 2022-04-13 阅读 71
python

研究 python 变量与 list 的传递方式

文章目录

1. 背景

工作的时候写了一个python脚本分析数据,里面有一段代码:

# 定义函数
def do_something(a, b):
	a = 5  # 举例
	b = 6  # 举例

# 调用函数
x = 0
y = 0
do_something(x, y)

我希望得到的结果(对于两个整型变量) x=5, y=6,但是实际上我得到的结果x=0, y=0。我记得之前写过一段代码,将实参传递给函数的之后,调用函数,再次打印实参,其值会发生变化,这让我很疑惑。

2. 一段示例代码找出原因

摸索了一会,发现 python 整型变量(class 'int')的赋值操作会将变量名指向同一个对象(数字1,2,3 … 也是一个对象,他们的值为1,2,3 …):

# 变量是引用传递,但是没法改值,只能 return 或用 list
def show_number(n):
    print("n:\t", n)
    print("id n:\t", id(n))


a = 0
print("a:\t", a)
print("id a:\t", id(a))  # id a:	 140728273872656
print("id 0:\t", id(0))  # id 0:	 140728273872656
print("type(0):\t", type(0))
print("type(a):\t", type(a))

show_number(a)
print("a:\t", a)

运行结果:

a:	 0
id a:	 140728273872656
id 0:	 140728273872656
type(0):	 <class 'int'>
type(a):	 <class 'int'>
n:	 0
id n:	 140728273872656
a:	 0
id a:	 140728273872656

也就是说,python 中式是没有办法对于整型变量进行如 c/c++ 中的引用传递 int do_something(&a, &b) 的。因为在 python 中,1,2,3 … 等整型是一个 int 类对象,所有对他们使用 等号 = 进行的赋值操作都是将其他变量指向这个整型对象的地址,并且,这个地址的整型变量的值是无法改变的

3. 两种方式到达我想要的效果

方式1:使用 list 或自定义 class 对变量进行封装

def get_list_2(l_a):
    l_a.append(3)
    
l_x = []
get_list_2(l_x)
print("l_x:\t", l_x)

运行结果:

l_x:	 [3]

方式2:使用 return

def get_number(a, b):
    a, b = 3, 4
    return a, b

a = 0
b = 0
a, b = get_number(a, b)
print("a:\t", a)
print("b:\t", b)

运行结果:

a:	 3
b:	 4

参考

  1. Python 直接赋值、浅拷贝和深度拷贝解析
举报

相关推荐

0 条评论