python的动态特性

python的动态特性,python,Python,我是编程MG和python的新手。 当我这样做时: j = 100 k = 200 l = j + k l 300 现在,如果我改变J的值,我希望l的输出会不同。为什么输出是相同的,我如何才能使它改变 j = 250 l 300 排队的时候 l = j + k 如果超出此范围,Python大致执行以下操作: 加载当前绑定到名称j和k的对象。这里,这将是整数100和200 执行添加。这将创建一个新的int对象,其值为300 将名称l绑定到结果对象 正如您所看到的,l只是绑定到

我是编程MG和python的新手。 当我这样做时:

 j = 100
 k = 200
 l = j + k
 l
 300

现在,如果我改变J的值,我希望l的输出会不同。为什么输出是相同的,我如何才能使它改变

 j = 250
 l
 300
排队的时候

l = j + k
如果超出此范围,Python大致执行以下操作:

  • 加载当前绑定到名称
    j
    k
    的对象。这里,这将是整数
    100
    200

  • 执行添加。这将创建一个新的
    int
    对象,其值为
    300

  • 将名称
    l
    绑定到结果对象

  • 正如您所看到的,
    l
    只是绑定到一个整数,这个整数不再“知道”它来自何处。

    这不是“动态”的意思。将值分配给变量后,该变量将保留该值,直到为其分配不同的值

    动态语言是那些其变量在运行时可以采用任何类型的语言,通常甚至可以在其生命周期内保存多个不同类型的值:

    a = 1
    print a
    a = "hello"
    print a
    
    也就是说,您可以实现与预期类似的目标:

    >>> j = 100
    >>> k = 200
    >>> l = lambda: j + k
    >>> l()
    300
    >>> j = 250
    >>> l()
    450
    

    在您的代码中,
    l=j+k
    只计算
    j+k
    ,结果是整数值
    300
    。然后名称
    l
    绑定到值
    300
    int
    对象

    加法计算一次且仅计算一次。如果希望执行新的添加,那么必须以某种方式显式调用它

    j = 100
    k = 200
    l = j + k
    
    • j是指向存储100的内存的指针
    • k是指向存储200的内存的指针
    • l是指向存储300的内存的指针
    l不是指向j+k的未剪切函数的指针,正如我所想的那样

    改变j不会改变l指向300的事实。

    编程的结构和解释(http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-10.html#%_sec_1.1.2)在这方面有一个非常好的章节

    当您使用诸如j=100或k=200之类的表达式时,基本上就是给值赋予了一个新的“名称”。这是您正在进行的抽象,以便以后更容易找到此数字。为变量赋值时,解释器会:

  • 找出(递归地)表达式右侧的内容
  • 将其解析为值(或字符串或int等)
  • 为该值指定要分配的“名称”
  • 因此,在l=j+k的情况下,解释器计算j+k的值,然后将该值命名为“l”。我不知道它从哪里来,它只是指向我们刚才计算的值

    你要找的是lambda。Lambda创建一个过程,每次调用它时都会执行该过程

    因此,您可以创建一个过程(函数):

    l=λj,k:j+k

    其中i和j是过程的参数。每次调用该过程时,它都会查看您提供给它的输入(在这个特殊情况下,i和j是输入),然后继续执行该过程。另一个潜在候选人是:

    l=λ:j+k

    这个过程不接受任何输入,但每次调用它时,它都会查找变量j和k分配的任何值,然后计算它们

    对于初学者来说,变量、过程和函数的概念可能会非常混乱;这是一个很好的问题,我希望这个答案能有所帮助:)


    -内森·拉肯迈尔(Nathan Lachenmyer)

    “我希望‘l’的输出会有所不同。”。真正地为什么?请解释您的期望和原因。Python不是电子表格:-)但是,如果您确实想要这种行为,可以查看符号数学的sympy(外部)模块。