研究 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
参考
- Python 直接赋值、浅拷贝和深度拷贝解析