Problem found
I recently encountered a question during an interview. I chose to use JavaScript or Python to reverse strings. I chose Python and then wrote the code (wrong):
#!/usr/bin/env python #-*-coding:utf-8-*- __author__ = 'ZhangHe' def reverse(s): l = 0 r = len(s) - 1 while l < r: s[l],s[r] = s[r],s[l] l += 1 r -= 1 return s
Then the interviewer asked two questions:
(1) Can the value of a string be modified in this way? [I answered, yes] [Wrong answer]
(2) Is the parameter passed in an address? Or a copy? [I answered, pass value. Numbers, strings, and tuples are passed by value (immutable); list and dict are passed by reference (mutable);] [Answer is passed by value, which can be modified directly] [Answer is wrong, the correct one is pass by value, immutable]
Thinking about the following
Although I often use strings, I have never studied this issue, so I searched the Internet for information:
Strings in Python are immutable types, which means that changing the elements of a string requires creating a new string.
A string is composed of independent characters and is also a sequence. The general operation methods of sequences also apply to strings.
For example:
Access substrings sequentially through slicing operations;
Use len() to find the length of a string, etc.;
Determine whether a certain character exists in the string through the in or not in operator.
There is no character type in Python, but a string of length 1 is used to represent this concept. Of course, this is actually a substring.
Example of access string:
1 aString = 'Hello World!' 2 print(aString[0]) 3 print(aString[1:5]) 4 print(aString[6:])
Output:
H ello World!
So how to change a string?
You can "update" an existing string by assigning (or reassigning) a value to a variable. The new value may be similar to the original value, or it may be completely different from the original string.
For example:
1 aString = 'Hello World!' 2 aString = aString[:6] + 'Python!' 3 print(aString) 4 aString = 'different string altogether' 5 print(aString)
Output:
Hello Python! different string altogether
So how to delete a character or string?
Repeat again, strings are immutable, so you can’t just delete a certain character in a string. What you can do is to clear an empty string, or combine strings with unnecessary parts removed. rise up to form a new string.
Suppose you want to remove the lowercase "l" from "Hello World!", then you need to do this:
1 aString = 'Hello World!' 2 aString = aString[:3] + aString[4:] 3 print(aString)
Output:
Helo World!
Empty or delete a string by assigning an empty string or using the del statement. However, in most applications, there is no need to explicitly delete strings. The code that defines this string will eventually end, at which time Python will automatically release the string.
So, there is something wrong with the reverse string code I wrote. The correct code should be:
#!/usr/bin/env python #-*-coding:utf-8-*- __author__ = 'ZhangHe' def reverse(s): t = '' r = len(s) - 1 while r>=0: t = t + s[r] r -= 1 return t s = 'abcd' print reverse(s)
So are the passed formal parameter s and actual parameter s the same object? You can use the id function to verify. Let's first look at the official explanation of the id function.
In other words, the id(obj)
function returns the address of the object obj in memory during its life cycle. The parameter type of the id function is an object (for all objects in Python, the variable stores a reference to the object)
We can use the following code to verify:
#!/usr/bin/env python #-*-coding:utf-8-*- __author__ = 'ZhangHe' def reverse(s): print id(s) t = '' r = len(s) - 1 while r>=0: t = t + s[r] r -= 1 return t s = 'abasdfasdfcdabasdfasdfcd' print id(s) print reverse(s)
Output:
38264224 38264224 dcfdsafdsabadcfdsafdsaba
It can be seen that the parameter passed in is actually the address of the string object. If the parameter is changed to list or dict, the output id will still be the same. Therefore, the method of passing parameters in Python is to pass the address of the object , but numbers, strings and tuples cannot be modified directly, but list and dict can be modified directly.
Summary
The above is the entire content of this article. I hope the content of this article can bring some help to everyone's study or work. If you have any questions, you can leave a message to communicate.