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

Python变量声明

张翰海
2023-03-14
问题内容

学习Python,并且有一些基本的疑问。

1.我已经看到变量声明(这里的路径)为

class writer:
    path = ""

有时,没有显式声明,而是通过进行初始化__init__

def __init__(self, name):
    self.name = name

我了解的目的__init__,但建议在其他任何函数中声明变量。

2.如何创建变量以保存自定义类型?

class writer:
    path = "" # string value
    customObj = ??

问题答案:

好的,首先是第一件事。

Python中没有“变量声明”或“变量初始化”之类的东西。

我们简单地将其称为“分配”,但可能应该仅将其称为“命名”。

赋值的意思是“现在此名称在左侧是指评估右侧的结果,而不管其之前所指的含义(如果有的话)”。

foo = 'bar' # the name 'foo' is now a name for the string 'bar'
foo = 2 * 3 # the name 'foo' stops being a name for the string 'bar',
# and starts being a name for the integer 6, resulting from the multiplication

这样,Python的名称(可以说比“变量”更好的术语)没有关联的类型。值确实。您可以对任何事物重新应用相同的名称,而不管其类型如何,但是事物仍然具有取决于其类型的行为。名称只是引用值(对象)的一种方式。这回答了您的第二个问题:您
不会 创建变量来保存自定义类型。您不会创建变量来保存任何特定类型。您根本不需要“创建”变量。您给对象命名。

第二点:关于类,Python遵循一条非常简单的规则,实际上比Java,C 和C# 之类的 语言更加一致: 块中
声明的所有内容都是class类的一部分。因此, def这里编写的函数()是方法,即类对象的一部分(不按实例存储),就像在Java,C


和C#中一样;但是这里的其他名称 也是 该类的一部分。同样,名称只是名称,它们没有关联的类型,而 函数 在Python中
也是对象 。从而:

class Example:
    data = 42
    def method(self): pass

*在Python中, *类也是对象

因此,现在我们创建了一个名为的 对象Example,该 对象 表示Examples的所有事物的类。该对象具有两个用户提供的
属性 (在C
++中为“成员”;在C#中为“字段或属性或方法”;在Java中为“字段或方法”)。其中之一被命名data,它存储整数值42。另一个名为method,它存储一个函数对象。(Python自动添加了更多属性。)

但是,这些属性实际上并不是对象的真正组成部分。从根本上讲,一个对象只是一堆更多的名称(属性名称),直到您了解到无法再划分的事物为止。因此,如果您有意设置值,则可以在类的不同实例之间甚至在不同类的对象之间共享值。

让我们创建一个实例:

x = Example()

现在,我们有一个名为的单独对象x,它是的实例Example。该datamethod是对象不实际的一部分,但我们仍然可以找一找通过x的,因为有些魔力,Python做幕后。method特别是,当我们进行查询时,我们将获得一个“绑定方法”(当我们调用它时,x将自动作为self参数传递,如果Example.method直接进行查询就不会发生)。

当我们尝试使用时会发生什么x.data

当我们检查它时,首先要在对象中查找它。如果在对象中找不到它,Python将在该类中查找。

但是,当我们 分配给时 x.data,Python将在对象上创建一个属性。它 不会 替换类的属性。

这使我们可以进行 对象
初始化。__init__创建新实例时,Python将自动在新实例上调用类的方法(如果存在)。在这种方法中,我们可以简单地分配给属性,以在每个对象上为该属性设置初始值:

class Example:
    name = "Ignored"
    def __init__(self, name):
        self.name = name
    # rest as before

现在,name当我们创建一个时必须指定一个Example,每个实例都有自己的nameExample.name每当我们查询.name实例的时,Python都会忽略class属性,因为将首先找到实例的属性。

最后一个警告: 修改(变异)和赋值是不同的事情!

在Python中,字符串是不可变的。它们不能被修改。当您这样做时:

a = 'hi '
b = a
a += 'mom'

无需更改 原始的“ hi”字符串。在Python中这是不可能的。相反,您将创建一个 字符串'hi mom',并导致a不再是的名称'hi ',而开始是的名称'hi mom'。我们也b为命名'hi ',在重新应用该a名称后,b它仍然是的名称'hi ',因为它'hi '仍然存在并且尚未更改。

但是列表可以更改:

a = [1, 2, 3]
b = a
a += [4]

现在b也是[1、2、3、4],因为我们b为与该名称相同的事物a命名了一个名称,然后更改了该名称。我们没有为a命名创建新列表,因为Python只是对列表进行了+=不同的对待。

这对对象很重要,因为如果您有一个列表作为类属性,并使用实例来修改该列表,则在所有其他实例中都将“看到”更改。这是因为(a)数据实际上是类对象的一部分,而不是任何实例对象;(b)因为您正在修改列表而不是进行简单的分配,所以您没有创建新的实例属性来隐藏类属性。



 类似资料:
  • let和const是JavaScript里相对较新的变量声明方式。 像我们之前提到过的,let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。 const是对let的一个增强,它能阻止对一个变量再次赋值。 因为TypeScript是JavaScript的超集,所以它本身就支持let和const。 下面我们会详细说明这些新的声明方式以及为什么推荐使用它们来代替v

  • 局部变量使用关键字 def 来声明,其只在声明它的地方可见 . 局部变量是 Groovy 语言的一个基本特性. 例子 13.2 . 使用局部变量 def dest = "dest" task copy(type: Copy) { form "source" into dest }

  • Rust 语言可以先声明变量绑定,后面才将它们初始化。但是这种情况用得很少,因为这样很可能导致使用未 初始的变量。 fn main() { // 声明一个变量绑定 let a_binding; { let x = 2; // 初始化一个绑定 a_binding = x * x; } println!("a bi

  • 问题内容: 我不明白这个脚本有什么问题 我希望它在表中插入10个值,但是第二行有错误。 问题答案: MySQL不支持执行存储过程代码的匿名块。 您需要创建一个包含该代码的存储过程,然后调用它。 另外,您在插入语句的末尾缺少分号。我修好了 您可能还想使用concat()而不是+来生成名称,但是我将把更改留给您。 创建过程: 调用过程:

  • 主要内容:类型断言(Type Assertion),类型推断,变量作用域变量是一种使用方便的占位符,用于引用计算机内存地址。 我们可以把变量看做存储数据的容器。 TypeScript 变量的命名规则: 变量名称可以包含数字和字母。 除了下划线 _ 和美元 $ 符号外,不能包含其他特殊字符,包括空格。 变量名不能以数字开头。 变量使用前必须先声明,我们可以使用 var 来声明变量。 我们可以使用以下四种方式来声明变量: 声明变量的类型及初始值: 例如: 声明变量的类型,

  • 问题内容: 我在Python中看到了这个声明,但是我不明白它的含义,也找不到解释: 问题是:和之间为什么会有逗号?那是什么类型的作业? 问题答案: 那是一个 “元组” 或 “解构” 分配- 参见例如多重分配语义。返回包含两个值的元组,因此等效于: 请参阅语言参考中的赋值语句: 如果目标列表是目标的逗号分隔列表:该对象必须是可迭代的,并且具有与目标列表中存在目标的项目数量相同的项目,并且这些项目从左