为了账号安全,请及时绑定邮箱和手机立即绑定

关于Python 2.7中的可变和不可变数据类型的困惑

关于Python 2.7中的可变和不可变数据类型的困惑

一只甜甜圈 2021-03-29 22:01:37
我已经读到,编写函数时,最好将参数复制到其他变量中,因为并不总是清楚变量是否不可变。[我不记得在哪里所以不问]。我一直在据此编写函数。据我了解,创建新变量需要一些开销。它可能很小,但是在那里。那应该怎么办呢?我应该创建新变量还是不保留参数?我已经读过这个和这个。如果为什么可以很容易地更改float和int是不可变的,我会感到困惑。编辑:我正在编写简单的函数。我将发布示例。当我读到在Python中应该复制参数时,我写了第一个,而在通过反复试验意识到不需要时,我写了第二个。#When I copied arguments into another variabledef zeros_in_fact(num):    '''Returns the number of zeros at the end of factorial of num'''    temp = num    if temp < 0:        return 0    fives = 0    while temp:        temp /=  5        fives += temp    return fives#When I did not copy arguments into another variabledef zeros_in_fact(num):    '''Returns the number of zeros at the end of factorial of num'''    if num < 0:        return 0    fives = 0    while num:        num /=  5        fives += num    return fives
查看完整描述

4 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

我认为最好在此类问题中保持简单。


您问题中的第二个链接是一个很好的解释。总之:


方法带有参数,如在该说明中指出的那样,这些参数是“按值”传递的。函数中的参数采用传入的变量的值。


对于诸如字符串,整数和浮点数之类的原始类型,变量的值是指向内存中代表数字或字符串的空间的指针(下图中的箭头)。


code               | memory

                   |

an_int = 1         |    an_int ---->  1

                   |                  ^    

another_int = 1    |    another_int  /

在方法中重新分配时,将更改箭头指向的位置。


an_int = 2         |    an_int -------> 2

                   |    another_int --> 1

数字本身不会改变,并且由于这些变量仅在函数内部,函数外部才具有作用域,因此传入的变量与之前相同:1和1。但是,当您传入列表或对象时,例如,您可以更改它们指向函数外部的值。


a_list = [1, 2, 3]    |              1   2   3

                      |   a_list ->| ^ | ^ | ^ |

                      |              0   2   3

a_list[0] = 0         |   a_list ->| ^ | ^ | ^ |

现在,您可以更改列表或对象中的箭头指向的位置,但是列表的指针仍然指向与以前相同的列表。(在上图中,两组箭头实际上实际上应该只有一个2和3,但是绘制箭头会变得很困难。)


那么实际的代码是什么样的呢?


a = 5

def not_change(a):

  a = 6

not_change(a)

print(a) # a is still 5 outside the function


b = [1, 2, 3]

def change(b):

  b[0] = 0

print(b) # b is now [0, 2, 3] outside the function

是否复制给定的列表和对象(int和字符串无关紧要),然后返回新变量还是更改传入的变量,取决于您需要提供的功能。


查看完整回答
反对 回复 2021-04-02
?
慕神8447489

TA贡献1780条经验 获得超1个赞

如果要重新绑定名称,则它包含的对象的可变性是无关紧要的。仅当执行变异操作时,才必须创建副本。(而且,如果您在两行之间阅读,则会间接说“不要使传递给您的对象发生变异”。)


查看完整回答
反对 回复 2021-04-02
  • 4 回答
  • 0 关注
  • 264 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信