我正在阅读一些关于函数的材料,并编写Python代码来理解伪代码示例。
目标是在调用函数之后打印变量,然后检查新值。
def my_sum(x, y, z):
z = x + y
return x, y, z
A = 1
B = 2
C = 0
my_sum(A, B, C)
my_sum(B, C, A)
my_sum(C, A, B)
my_sum(A, B, C)
my_sum(B, C, A)
print(A, B, C)
我的第一本能是写这个过程方法,但是当我调用时,程序不会给出正确的答案,因为A、B和C没有保存函数内部发生的任何事情。所以A总是1,B是2,以此类推
结果,当我用参数赋值调用时,变量A、B和C接收新的值,并且它们现在保留它。最后,它打印21,8,13,这是答案。
A, B, C = my_sum(A, B, C)
B, C, A = my_sum(B, C, A)
C, A, B = my_sum(C, A, B)
A, B, C = my_sum(A, B, C)
B, C, A = my_sum(B, C, A)
您将如何实现该算法,或者编写此算法的其他方法是什么?
问题是,我根本不知道为什么这会起作用!这只是一个偶然的猜测,正好解决了我的问题。
发布于 2022-07-29 12:39:14
python没有通过引用传递的选项,只有按值传递,所以您的构造是正确的,因为您返回的是新值(以元组形式),而不是更改要传入的变量的值。
发布于 2022-07-29 12:57:04
在Python中,对参数名称的赋值不会影响调用者使用的名称的值。它们是单独的名称,最初引用同一个对象,但是一旦为参数名称分配了其他东西(比如和),它就引用了一个不同的对象。
第二次尝试是有效的,因为函数返回一个元组,其中包含三个参数名的值,而主程序将元组解压缩回自己的名称。
但是,由于函数不需要第三个参数的原始值,并且它不触及前两个参数,调用方实际上不需要传递第三个参数,也不需要为前两个参数更新自己的名称.因此,该函数可以设计为只使用两个参数并返回新值:
def my_sum(x, y):
return x + y
A = 1
B = 2
C = my_sum(A, B)
A = my_sum(B, C)
B = my_sum(C, A)
C = my_sum(A, B)
A = my_sum(B, C)
发布于 2022-07-29 13:01:13
让我们从函数定义和一个调用开始。
def my_sum(x, y, z):
z = x + y
return x, y, z
A = 1
B = 2
C = 0
my_sum(A, B, C)
如果没有该函数,这在功能上与以下内容相同:
A = 1
B = 2
C = 0
x = A
y = B
z = C
z = x + y
_ = x, y, z
# x, y, and z are discarded since you don't do anything with the return value
您不应该期望这会改变A
、B
或C
,或者如果您这样做了,您就会对python变量或名称的工作方式产生误解。
Python变量或名称只是一个指向值的dict
。
A = 1
B = 2
C = 0
my_sum(A, B, C)
# this is a very condensed version of what python does in the background
dict_of_globals = dict()
dict_of_globals['A'] = 1
dict_of_globals['B'] = 2
dict_of_globals['C'] = 3
my_sum_local_dict = dict()
my_sum_local_dict['x'] = dict_of_globals['A']
my_sum_local_dict['y'] = dict_of_globals['B']
my_sum_local_dict['z'] = dict_of_globals['C']
# and so on..
因为您只将1
分配给dict_of_globals['A']
,所以期望它不是1
是不合理的。
这样做的原因是:
A, B, C = my_sum(A, B, C)
是因为要将返回值赋值给A
。
A = x # etc..
# or:
dict_of_globals['A'] = my_sum_local_dict['x']
https://stackoverflow.com/questions/73166809
复制相似问题