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

了解python的名称绑定

慕河
2023-03-14
问题内容

我试图为自己澄清Python的“将”值赋值给变量的规则。

Python和C ++之间的以下比较有效吗?

  1. 在C / C ++中,该语句的int a=7意思是,内存被分配给一个整数变量a(符号的 =),然后才将值7存储在其中。

  2. 在Python语句a=7装置, 无名 与值7(在数量整数对象 RIGHT 的侧=)首先创建并存储在存储器的某个地方。然后将名称a绑定到该对象

以下C ++和Python程序的输出似乎可以证明这一点,但是我是否想得到一些反馈。

C ++产生不同的存储位置用于ab 同时ab似乎是指相同的位置在Python(由ID的输出去()函数)

C ++代码

#include<iostream>
using namespace std;
int main(void)
{
  int a = 7;
  int b = a; 
  cout << &a <<  "  " << &b << endl; // a and b point to different locations in memory
  return 0;
}

输出:0x7ffff843ecb8 0x7ffff843ecbc

Python:代码

a = 7
b = a
print id(a), ' ' , id(b) # a and b seem to refer to the same location

输出:23093448 23093448


问题答案:

是的,您基本上是正确的。在Python中,可以将变量名视为对值的引用(尽管它的工作原理类似,但不是C ++引用,更多的是声明它引用了某种东西)。

顺便说一句,Python方式与C 非常相似,C int &b = a只是意味着ab引用相同的值。

或C int *pb = &a,其含义a*pb引用的是相同的值,但是带来了所有尚未使C接受大脑弯曲的人们带来的困惑:-)

在Python中为变量名称赋值会使名称引用 不同的 值,它永远不会复制值本身:

a = 7   # Create "7", make "a" refer to it.
b = a   # make "b" refer to  the "7" as well.
a = 42  # Create "42", make "a" refer to it, b still refers to the "7".

(我说的是“创建”,但不一定如此-如果某个位置已经存在某个值,则可以重复使用它)。

在类似C的语言中,第二条语句b = a创建一个 值,将“ 7”复制到其中,然后命名为b。在Python中,它仅以ab引用
相同的 值结束。

在基础数据是不可变的(无法更改)的地方,通常会使Python看起来与C的行为相同。

但是,对于 可变 数据(与在C中使用指针或在C ++中使用引用相同),人们有时会感到惊讶,因为他们没有意识到背后的价值可能是共享的:

>>> a = [1,2,3] ; print a
[1, 2, 3]

>>> b = a ; print b
[1, 2, 3]

>>> a[1] = 42 ; print a
[1, 42, 3]

>>> print b   #WTH?
[1, 42, 3]

有一些方法可以获取值的 独立 副本,例如:

b = a[:]
b = [item for item in a]

(这将适用于一个级别,其中b = a适用于零级别),或者,deepcopy如果您想在
完全 唯一的情况下使用,则可将其用于任何必要级别。



 类似资料:
  • 我为我的应用程序运行了这段代码 我得到了以下结果 {Thread[pool-1-thread-1,5,main]=[Ljava.lang.StackTraceElement;@E21F0DC,Thread[queued-work-looper,5,main]=[Ljava.lang.StackTraceElement;@1FEC5E5,Thread[FinalizerWatchdogDaemon,

  • 问题内容: 来自python线程文档 在CPython中,由于使用了全局解释器锁,因此只有一个线程可以一次执行Python代码(即使某些面向性能的库可以克服此限制)。如果希望您的应用程序更好地利用多核计算机的计算资源,建议您使用多处理。但是,如果您要同时运行多个I / O绑定任务,则线程化仍然是合适的模型。 现在我有一个这样的线程工作者 这里做两件事 使用库抓取网址 使用JavaScript库分析

  • 我对一个问题感到沮丧,我花了几个小时试图解决它!问题是。我试图查找一个已经在我的jboss服务器中声明的主题(MyBestTopic ),但是我有这个异常 在我的java代码中,我试图像这样检索主题: 查看jboss server的启动,我可以看到主题与正确的名称绑定得很好: 最后,当我在jmx控制台上看到jndiView树时,该主题也得到了很好的部署: 相同的java在具有相同部署主题和数据源的

  • 问题内容: 我在HQL语句中绑定了命名参数,但只是没有被填充。 它输出类似这样的内容,这意味着未设置参数(coln,colv)并返回0条记录。 感谢您提供有关如何在HQL语句中绑定列名称的任何帮助。谢谢。马赫迪。 问题答案: 您不能将列名称绑定为参数。仅一列值。在绑定参数值和执行查询之前,在计算执行计划时必须知道该名称。如果您确实希望拥有这样的动态查询,请使用Criteria API或其他动态创建

  • 问题内容: 我正在研究Zeromq作为Java项目中的消息传递解决方案,但是我发现有关Java绑定的说明有些难以遵循。 http://www.zeromq.org/bindings:java 我不熟悉Java绑定,所以这些可能是愚蠢的问题,但是有人可以帮助我理解: 为什么我需要安装任何东西? 我在一台机器上构建的jar可以在另一系统上运行吗?我需要此应用程序具有可移植性。 如果是这样,为什么我需要

  • 问题内容: 我有一个非常简单的示例: 我有3个名为的函数,并按字母顺序在Python源文件中定义。每个函数定义的主体都是对其他函数之一的调用。您可以通过我的评论看到,我必须在它们的定义下方(在文本文件中)对这些函数中的第一个进行初始调用,但是您不一定需要在另一个调用它的函数之上定义一个函数。 当然,在所有函数定义(在Python和许多其他语言中)下都具有第一个可执行代码似乎是一种常见的做法,现在我

  • 英文原文:http://emberjs.com/guides/templates/binding-element-class-names/ 像其他所有属性一样,HTML元素的class属性也可以被绑定,如下所示: 1 2 3 <div {{bind-attr class="priority"}}> Warning! </div> 如果控制器的priority属性的值是"p4",上面的模板将

  • 问题内容: 我有一个具有以下结构的Python项目: 除具有以下代码的模块外,所有模块均为空: 并且定义: 现在我从根导入: 导入的结果使我感到惊讶,因为它表明第二条语句已被覆盖。但是文档指出from语句不会绑定模块名称: 从形式不绑定模块名称:它遍历标识符列表,在步骤(1)中找到的模块中查找每个标识符,然后将本地名称空间中的名称绑定到由此找到的对象。 实际上,在终端中使用语句时,不会引入任何模块