首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用参数作为变量名:为什么要解决这个问题?

使用参数作为变量名:为什么要解决这个问题?
EN

Stack Overflow用户
提问于 2022-07-29 12:32:56
回答 3查看 64关注 0票数 0

我正在阅读一些关于函数的材料,并编写Python代码来理解伪代码示例。

目标是在调用函数之后打印变量,然后检查新值。

代码语言:javascript
运行
复制
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,这是答案。

代码语言:javascript
运行
复制
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)

您将如何实现该算法,或者编写此算法的其他方法是什么?

问题是,我根本不知道为什么这会起作用!这只是一个偶然的猜测,正好解决了我的问题。

EN

回答 3

Stack Overflow用户

发布于 2022-07-29 12:39:14

python没有通过引用传递的选项,只有按值传递,所以您的构造是正确的,因为您返回的是新值(以元组形式),而不是更改要传入的变量的值。

票数 1
EN

Stack Overflow用户

发布于 2022-07-29 12:57:04

在Python中,对参数名称的赋值不会影响调用者使用的名称的值。它们是单独的名称,最初引用同一个对象,但是一旦为参数名称分配了其他东西(比如和),它就引用了一个不同的对象。

第二次尝试是有效的,因为函数返回一个元组,其中包含三个参数名的值,而主程序将元组解压缩回自己的名称。

但是,由于函数不需要第三个参数的原始值,并且它不触及前两个参数,调用方实际上不需要传递第三个参数,也不需要为前两个参数更新自己的名称.因此,该函数可以设计为只使用两个参数并返回新值:

代码语言:javascript
运行
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2022-07-29 13:01:13

让我们从函数定义和一个调用开始。

代码语言:javascript
运行
复制
def my_sum(x, y, z):
    z = x + y
    return x, y, z

A = 1
B = 2
C = 0

my_sum(A, B, C)

如果没有该函数,这在功能上与以下内容相同:

代码语言:javascript
运行
复制
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

您不应该期望这会改变ABC,或者如果您这样做了,您就会对python变量或名称的工作方式产生误解。

Python变量或名称只是一个指向值的dict

代码语言:javascript
运行
复制
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是不合理的。

这样做的原因是:

代码语言:javascript
运行
复制
A, B, C = my_sum(A, B, C)

是因为要将返回值赋值给A

代码语言:javascript
运行
复制
A = x # etc..
# or:
dict_of_globals['A'] = my_sum_local_dict['x']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73166809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档