当前位置: 首页 > 面试题库 >

变异,重新绑定,复制值和赋值运算符之间的区别

陈淳
2023-03-14
问题内容
def f1(a, l=[]):
    l.append(a)
    return(l)

print(f1(1))
print(f1(1))
print(f1(1))

def f2(a, b=1):
    b = b + 1
    return(a+b)

print(f2(1))
print(f2(1))
print(f2(1))

f1自变量中l有一个默认值分配,并且仅被赋值一次,因此三个print输出分别为1、2和3。为什么f2不做类似的事情?

结论:

为了使我所学的内容更容易为该线程的未来读者所用,我总结如下:

  • 我在这个主题上找到了这个不错的教程

  • 我制作了一些简单的示例程序来比较 变异重新绑定复制值赋值运算符 之间的区别。


问题答案:

当你宣布你的功能,默认参数得到评估 的那一刻 。每次调用该函数时都不会刷新。

您的功能行为不同的原因是因为您对待它们的方式有所不同。在f1您使对象变异的同时,在f2创建新的整数对象并将其分配给中b。您未b在此处修改,而是在重新分配它。现在是另一个对象。在中f1,您将保持相同的对象

考虑一个替代函数:

def f3(a, l= []):
   l = l + [a]
   return l

行为类似于f2并且不会一直追加到默认列表。这是因为它是在l不修改默认参数中的对象的情况下创建的。

python中的常见样式是分配默认参数None,然后分配一个新列表。这可以解决整个歧义。

def f1(a, l = None):
   if l is None:
       l = []

   l.append(a)

   return l


 类似资料:
  • 本文向大家介绍C ++中的复制构造函数和赋值运算符之间的区别,包括了C ++中的复制构造函数和赋值运算符之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解C ++中的复制构造函数和赋值运算符之间的区别。 复制构造函数 它是一个重载的构造函数。 它将使用已经存在的对象数据/值初始化新对象。 在一些现有对象的帮助下创建新对象时使用它。 这两个对象将存储在单独的存储位置中。 如果在

  • 我知道Java不支持运算符重载,但我看到您可以为Integer对象赋值,例如,使用运算符,而不是使用setter。 所以我想知道是否有可能将这种行为实现到任何类?

  • 之间有什么区别 在Pythonnumpy.asarray作业?第一行的[]辫子是什么意思? 非常感谢。

  • 在《 到底什么时候会调用拷贝构造函数?》一节中,我们讲解了初始化和赋值的区别:在定义的同时进行赋值叫做 初始化(Initialization),定义完成以后再赋值(不管在定义的时候有没有赋值)就叫做 赋值(Assignment)。初始化只能有一次,赋值可以有多次。 当以拷贝的方式初始化一个对象时,会调用拷贝构造函数;当给一个对象赋值时,会调用重载过的赋值运算符。 即使我们没有显式的重载赋值运算符,

  • C++ 重载运算符和重载函数 就像其他运算符一样,您可以重载赋值运算符( = ),用于创建一个对象,比如拷贝构造函数。 下面的实例演示了如何重载赋值运算符。#include <iostream> using namespace std; class Distance { private: int feet; // 0 到无穷 int inches; // 0 到 12 public: // 所需的

  • 主要内容:基本赋值运算符,扩展后的赋值运算符赋值运算符用来把右侧的值传递给左侧的变量(或者常量);可以直接将右侧的值交给左侧的变量,也可以进行某些运算后再交给左侧的变量,比如加减乘除、函数调用、逻辑运算等。 Python 中最基本的赋值运算符是等号 ;结合其它运算符, 还能扩展出更强大的赋值运算符。 基本赋值运算符 是 Python 中最常见、最基本的赋值运算符,用来将一个表达式的值赋给另一个变量,请看下面的例子: 连续赋值 Python