【问题标题】:Function call and typecasting in python?python中的函数调用和类型转换?
【发布时间】:2018-06-04 09:56:10
【问题描述】:

假设我有一个列表

x = [1,2,3,4,5,6,7,8,9,10]

我想通过调用一个函数来打印这个列表。这是我打印列表的功能

def print_list(list_received):
        for var in list_received:       
                print var

我打电话给print_list(),如下所示

print_list(x)
    |      |
 method   argument
  name

所以上面的函数调用看起来与我们以前在 C/C++ 中所做的类似。

现在假设我有一个名为my_list的列表

my_list = [1,2,3,4,5,6,7,8,9,10]

我想将my_list 转换为元组,我会像下面那样做

my_tuple = tuple(my_list)

现在这里 tuple(my_list) 被称为 typecasting,正如我从这里看到的 http://www.pitt.edu/~naraehan/python2/data_types_conversion.html

现在上面的 typecasting 看起来与 CC++ 完全不同,就像我们以前在 C 中所做的那样

int x = 10;
char ch = (char)x

我的第一个疑问是关于将 C 看起来像 (tuple)my_list 更改为 tuple(my_list) 的合理理论或考虑是什么?答案可能是Python 不是C,但我想知道更多。

我的第二个问题是python解释器将如何决定它是函数调用还是类型转换函数,即my_print(x)tuple(my_list)的调用约定看起来相似但实际上两者都在做不同的工作。

【问题讨论】:

  • 但是类型转换函数也是函数
  • 谢谢@Ev.Kounis 是的tuple() 也是内置的。但是我可以在这里说我在声明tuple(my_list) 中调用tuple() 方法吗?
  • 函数调用和类型转换函数没有区别。您调用tuple 函数。它返回一个元组。故事结束。
  • 但通常在C 中显式类型转换不被视为函数调用,不是吗?在 python int(x) 和 C (int)x 中,两者的工作方式相同,但约定不同,其中 x 是浮点变量。
  • 在python中,int(x)调用x.__int__(),可以是int.__int__float.__int__numpy.int64.__int_等,具体取决于x的类型

标签: python python-2.7 type-conversion


【解决方案1】:

my_tuple = tuple(my_list)my_list 对象创建类元组的实例。由于创建了一个新对象,这与 (tuple)my_list 在 C 中的类型转换不太一样。

my_tuple = tuple(my_list) 更接近于 C++ my_tuple = new Tuple(my_list)

【讨论】:

  • 谢谢。你能告诉我元组类实现或python标准的路径或来源,我可以在哪里看到实现。
  • 这是tuple documentation,来源是here
  • 非常感谢。这正是我所需要的。
【解决方案2】:

为什么要标识为普通函数或类型转换函数?它只是一个函数。

或者说python中几乎所有东西都是一个对象,实际上函数也是一种实现__call__的对象。

此外,实际上并没有类型转换功能。 tuple 充当构造函数,它接受一个可迭代对象并返回一个元组对象。

【讨论】:

  • 是的,我同意 tuple 返回元组对象。但在内部它将如何初始化/将列表转换为元组?通过调用类的构造函数之类的方法?如果我错了,请纠正我?
  • 就像 Jacques Gaudin 所说,它确实像构造函数一样工作。它不仅可以转换list,还可以转换任何可迭代的对象。
  • 它不像构造函数那样工作:元组是一个类
  • 是的@bobrobbob tuple 是一个类,但tuple 类的__init__() 方法将初始化它。
  • 对不起,我只是为了避免误解。它不是构造函数,它构造函数
【解决方案3】:

我可以回答你的第二个问题,Python 解释器基于范围(本地、封闭、全局、默认)工作。

例如:

def tuple(l_list):
     print l_list

l_list = [1,2]
tuple(l_list)

在上述情况下,它不进行类型转换,而是执行上述函数。为什么,因为一旦我们开始执行,它就会搜索元组对象并完成工作。如果没有找到,那么它会考虑默认关键字并进行转换。简而言之,它纯粹是在对象的范围内

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多