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

我已经读到,编写函数时,最好将参数复制到其他变量中,因为并不总是清楚变量是否不可变。[我不记得在哪里所以不问]。我一直在据此编写函数。


据我了解,创建新变量需要一些开销。它可能很小,但是在那里。那应该怎么办呢?我应该创建新变量还是不保留参数?


我已经读过这个和这个。如果为什么可以很容易地更改float和int是不可变的,我会感到困惑。


编辑:


我正在编写简单的函数。我将发布示例。当我读到在Python中应该复制参数时,我写了第一个,而在通过反复试验意识到不需要时,我写了第二个。


#When I copied arguments into another variable

def 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 variable

def 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


一只甜甜圈
浏览 265回答 4
4回答

摇曳的蔷薇

我认为最好在此类问题中保持简单。您问题中的第二个链接是一个很好的解释。总之:方法带有参数,如在该说明中指出的那样,这些参数是“按值”传递的。函数中的参数采用传入的变量的值。对于诸如字符串,整数和浮点数之类的原始类型,变量的值是指向内存中代表数字或字符串的空间的指针(下图中的箭头)。code&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| memory&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|an_int = 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; an_int ---->&nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ^&nbsp; &nbsp;&nbsp;another_int = 1&nbsp; &nbsp; |&nbsp; &nbsp; another_int&nbsp; /在方法中重新分配时,将更改箭头指向的位置。an_int = 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; an_int -------> 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; another_int --> 1数字本身不会改变,并且由于这些变量仅在函数内部,函数外部才具有作用域,因此传入的变量与之前相同:1和1。但是,当您传入列表或对象时,例如,您可以更改它们指向函数外部的值。a_list = [1, 2, 3]&nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;2&nbsp; &nbsp;3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp;a_list ->| ^ | ^ | ^ |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0&nbsp; &nbsp;2&nbsp; &nbsp;3a_list[0] = 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp;a_list ->| ^ | ^ | ^ |现在,您可以更改列表或对象中的箭头指向的位置,但是列表的指针仍然指向与以前相同的列表。(在上图中,两组箭头实际上实际上应该只有一个2和3,但是绘制箭头会变得很困难。)那么实际的代码是什么样的呢?a = 5def not_change(a):&nbsp; a = 6not_change(a)print(a) # a is still 5 outside the functionb = [1, 2, 3]def change(b):&nbsp; b[0] = 0print(b) # b is now [0, 2, 3] outside the function是否复制给定的列表和对象(int和字符串无关紧要),然后返回新变量还是更改传入的变量,取决于您需要提供的功能。

慕神8447489

如果要重新绑定名称,则它包含的对象的可变性是无关紧要的。仅当执行变异操作时,才必须创建副本。(而且,如果您在两行之间阅读,则会间接说“不要使传递给您的对象发生变异”。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python