首页 \ 问答 \ LINUX是什么时候诞生的

LINUX是什么时候诞生的

是什么时候诞生的? 还有,主要优点是什么?
更新时间:2024-02-28 09:02

最满意答案

首先你要明白,Python的函数传递方式是赋值,而赋值是通过建立变量与对象的关联实现的。
对于你的代码:
执行 d = 2时,你在__main__里创建了d,并让它指向2这个整型对象。
执行函数add(d)过程中:
d被传递给add()函数后,在函数内部,num也指向了__main__中的2
但执行num = num + 10之后,新建了对象12,并让num指向了这个新对象——12。
如果你明白函数中的局部变量与__main__中变量的区别,那么很显然,在__main__中,d仍在指着2这个对象,它没有改变。因此,你打印d时得到了2。
如果你想让输出为12,最简洁的办法是:
在函数add()里增加return num
调用函数时使用d = add(d)
代码如下:
def add(num):
num += 10
return num
d = 2
d = add(d)
print d

其他回答

#这是python函数的格式
def function_name(arg1,arg2[,...]):
     statement
 [return value]  

#以下是示例,定义TEST函数
>>> a=2
>>> b=2
>>> def test(b):
 ...     test=a*b
 ...     return test
>>> print test(10)
 20
Python中函数的参数传递
1.普通的参数传递

>>> def add(a,b):
return a+b

>>> print add(1,2)
3
>>> print add('abc','123')
abc123

2.参数个数可选,参数有默认值的传递

>>> def myjoin(string,sep='_'):
return sep.join(string)

>>> myjoin('Test')
'T_e_s_t'
>>> myjoin('Test',';')
'T;e;s;t'

>>> def myrange(start=0,stop,step=1):
print stop,start,step

SyntaxError: non-default argument follows default argument

参数sep的缺省值是'_' 如果这个参数不给定值就会使用缺省值 如果给定 则使用给定的值
需要注意 如果一个参数是可选参数 那么它后面所有的参数都应该是可选的,另外 可选参数的顺序颠倒依然可以正确的给对应的参数赋值 但必须清楚的指明变量名和值
3.个数可变参数

>>> def printf(fmt,*arg):
print fmt%arg

>>> printf ('%d is larger than %d',2,1)
2 is larger than 1

函数中的*arg必须是最后一个参数,*表示任意多个参数,*arg会把除了前面以外所有的参数放到一个tuple里面传递给函数,可以在函数中通过arg来访问
arg是一个tuple,可以通过访问tuple的方法在函数中访问arg
另一种方式传递任意个数参数是通过dictionary的方式来传递 同样也可以接受多个参数 但是每个参数需要指明名称对应关系比如a=1,b=2,c=3

>>> def printf(format,**keyword):
for k in keyword.keys():
print "keyword[%s] %s %s"%(k,format,keyword[k])

>>> printf('is',one=1,tow=2,three=3)
keyword[three] is 3
keyword[tow] is 2
keyword[one] is 1

这些方法可以混在一起用 但是一定要注意顺序,函数会先接受固定参数,然后可选参数,然后任意参数(tuple),然后字典任意参数(dict)
对象vs变量
在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸引着很多pythoner的一点。所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。所以,希望大家在看到一个python变量的时候,把变量和真正的内存对象分开。
类型是属于对象的,而不是变量。
这样,很多问题就容易思考了。
例如:

对象vs变量
12
    nfoo = 1   #一个指向int数据类型的nfoo(再次提醒,nfoo没有类型)lstfoo = [1]   #一个指向list类型的lstfoo,这个list中包含一个整数1

可更改(mutable)与不可更改(immutable)对象
对应于上一个概念,就必须引出另了另一概念,这就是可更改(mutable)对象与不可更改(immutable)对象。
对于python比较熟悉的人们都应该了解这个事实,在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。那么,这些所谓的可改变和不可改变影响着什么呢?
可更改vs不可更改
12345
    nfoo = 1nfoo = 2lstfoo = [1]lstfoo[0] = 2

代码第2行中,内存中原始的1对象因为不能改变,于是被“抛弃”,另nfoo指向一个新的int对象,其值为2
代码第5行中,更改list中第一个元素的值,因为list是可改变的,所以,第一个元素变更为2。其实应该说,lstfoo指向一个包含一个对象的数组。赋值所发生的事情,是有一个新int对象被指定给lstfoo所指向的数组对象的第一个元素,但是对于lstfoo本身来说,所指向的数组对象并没有变化,只是数组对象的内容发生变化了。这个看似void*的变量所指向的对象仍旧是刚刚的那个有一个int对象的list。
如下图所示:

python的函数参数传递:传值?引用?
对于变量(与对象相对的概念),其实,python函数参数传递可以理解为就是变量传值操作,用c++的方式理解,就是对void*赋值。如果这个变量的值不变,我们看似就是引用,如果这个变量的值改变,我们看着像是在赋值。有点晕是吧,我们仍旧据个例子。
不可变对象参数调用
12345
    def changeint( a ):    a = 10nfoo = 2 changeint(nfoo)print nfoo #结果是2

这时发生了什么,有一个int对象2,和指向它的变量nfoo,当传递给changeint的时候,按照传值的方式,复制了变量nfoo的值,这样,a就是nfoo指向同一个int对象了,函数中a=10的时候,发生什么?(还记得我上面讲到的那些概念么),int是不能更改的对象,于是,做了一个新的int对象,另a指向它(但是此时,被变量nfoo指向的对象,没有发生变化),于是在外面的感觉就是函数没有改变nfoo的值,看起来像c++中的传值方式。
可变对象参数调用
12345
    def changelist( a ):    a[0] = 10lstfoo = [2]changelist(lstfoo )print nfoo #结果是[10]

当传递给changelist的时候,变量仍旧按照“传值”的方式,复制了变量lstfoo 的值,于是a和lstfoo 指向同一个对象,但是,list是可以改变的对象,对a[0]的操作,就是对lstfoo指向的对象的内容的操作,于是,这时的a[0] = 10,就是更改了lstfoo 指向的对象的第一个元素,所以,再次输出lstfoo 时,显示[10],内容被改变了,看起来,像c++中的按引用传递。

相关问答

更多
  • 楼主的理解没有问题啊 . python中函数的实参传递规则是: 标注了参数名的就要按参数名传递,打乱顺序的情况下一定要加参数名,否则会混乱的。 没有缺省的实参情况下就会依次传递,如果不够的话,后面的会自动去取自己的缺省值。 如果实参的数量比形参要多的话,就要用到带*号的参数名了。
  • 首先你要明白,Python的函数传递方式是赋值,而赋值是通过建立变量与对象的关联实现的。 对于你的代码: 执行 d = 2时,你在__main__里创建了d,并让它指向2这个整型对象。 执行函数add(d)过程中: d被传递给add()函数后,在函数内部,num也指向了__main__中的2 但执行num = num + 10之后,新建了对象12,并让num指向了这个新对象——12。 如果你明白函数中的局部变量与__main__中变量的区别,那么很显然,在__main__中,d仍在指着2这个对象,它没有改变 ...
  • def plus(a,b): z = a + 1 c = b + 5 return (z,c) (q,w) = plus(1,2) plud(q,w) ##我这里假设a=1,b=2 ##首先plus(1,2),得到z=2,c=7,通过return 让(q,w)=(z,c)的值,然后plud(q,w)即可实现将z,c的值传递给下一个函数
  • 对象vs变量 在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸引着很多pythoner的一点。所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。所以,希望大家在看到一个python变量的时候,把变量和真正的内存对象分开。 类型是属于对象的,而不是变量。 这样,很多问题就容易思考了。 例如: 对象vs变量 12 nfoo = 1 #一个指向int数据类型的nfoo(再次提醒,nfoo没有类型)lstFoo = [1] #一个指向list ...
  • import sys print sys.argv[1] #保存为main.py #在控制台下输入 python main.py "hello" #就有hello打印出来了 前提是你配置好了环境变量
  • >>> total = 0 >>> >>> def sum(arg1, arg2): ... total = arg1+arg2 ... print 'inside the function total total : %s' % (total) ... return total ... >>> sum(10, 20) inside the function total total : 30 30 >>> print 'outside the function global total : %s' % (t ...
  • 一个lambda函数(或者更准确地说,一个lambda 表达式 )只是一个你可以在现场定义的函数,就在你需要的地方。 例如, f = lambda x: x * 2 与... 完全一样 def f(x): return x * 2 当我确切地说,我的意思是 - 他们反汇编到相同的字节码。 两者之间的唯一区别在于,第二个示例中定义的名称有一个名称。 Lambda表达式变得有用,因为创建一个不是一个声明,这意味着,正如其他人已经回答的那样,您可以这样做 print iterator(lambda x ...
  • 我想你只是在寻找value_counts() data['c_type'].value_counts() 准确提供您所描述的内容。 示例 : >>> data b_type c_type 0 d b 1 d a 2 d a 3 c a 4 c a 5 d b 6 c a 7 d b 8 c b 9 c a ...
  • 如果您考虑将名称标签附加到对象,而不是将对象填充到命名框中,Python会更有意义。 def lala(a): n = [0, 0 , 0] a = n 这是正在发生的事情。 您正在接收参数(在本例中为列表)并为其指定名称a 。 您正在创建一个新列表并将其命名为n 。 您将给出名为n的附加名称的列表a 。 两个名称a和n都是lala函数的本地名称,因此它们在函数结束时“到期”。 您在函数中创建的列表现在没有名称,Python会丢弃它。 换句话说, a不是可以放入新列表的框。 这是您给出的名 ...
  • show_double(value)是一个函数调用,参数是value 。 你主要调用show_double这种方式从主函数。 def show_double(number):这基本上是函数defing从那个特定功能开始的地方。 你可以从其他地方像从主函数那样调用它。 number参数使您可以用任何具体的值调用该函数,因此它不会被硬编码,也不会使用全局变量。 在这种特殊情况下,您将传递值5以进行打印,但在另一个函数调用中,这可能与6,7,10等任何值类似。 基本上,这样你可以使你的打印灵活。 在你的代码中,主 ...

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)